package Persistencia;

import Negocio.Anuncio;
import Negocio.Comentario;
import Negocio.Evento;
import Negocio.EventoPrivado;
import Negocio.Usuario;
import Persistencia.PDatos;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;


public class PEvento {

    public static void crearEventoBD(Evento e) {
        int i = 0;
        Connection con = null;
        Statement st = null;
        ResultSet r = null;
        java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String fechaIni = sdf.format(e.getFechaIni());
        String fechaFin = sdf.format(e.getFechaFin());

        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();
            if (e instanceof EventoPrivado) { //compruebo si el evento es eprivado 
                EventoPrivado ep = (EventoPrivado) e;
                i = st.executeUpdate("insert into evento (fecha_inicio,fecha_fin,nombre,descripcion,foto,id_usuario,lugar,isAnuncio) values "
                        + "('" + fechaIni + "','" + fechaFin + "','" + ep.getNombre() + "','" + ep.getDescripcion() + "','" + ep.getRutaFoto() + "'," + ep.getUsuario().getId() + ",'" + ep.getLugar() + "',1)");
                //inserto el evento y me quedo con el ultimo id insertado en la bbdd
                r = st.executeQuery("SELECT ID FROM evento ORDER BY ID DESC");
                if (r.next()) {
                    ep.setId(r.getInt("id"));
                }
                for (Usuario amigos : ep.getAmigos()) { // para cuando sea un evento privado inserto los usuarios que estan invitados y la respuesta por defecto a 0

                    i = st.executeUpdate("insert into usuarioevento (respuesta,id_usuario,id_evento) values"
                            + "(0," + amigos.getId() + "," + e.getId() + ")");
                }
            } else if (e instanceof Anuncio) {//compruebo si es un anuncio el evento que me llega, lo inserto en la bbd 
                Anuncio a = (Anuncio) e;
                i = st.executeUpdate("insert into evento (fecha_inicio,fecha_fin,nombre,descripcion,foto,id_usuario,precio, isAnuncio) values "
                        + "('" + fechaIni + "','" + fechaFin + "','" + a.getNombre() + "','" + a.getDescripcion() + "','" + a.getRutaFoto() + "'," + a.getUsuario().getId() + ",'" + a.getPrecio() + "',0)");
                r = st.executeQuery("SELECT ID FROM evento ORDER BY ID DESC");//seleciono el ultimo id insertado y para hacer el setid()
                if (r.next()) {
                    a.setId(r.getInt("id"));
                }
            }
        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                st.close();
                con.close();
            } catch (SQLException ex) {
                Logger.getLogger(PEvento.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
    }

    public static Evento seleccionarEventoBD(Evento evento) {
        int i = 0;
        Connection con = null;
        Statement st = null;
        Usuario usuario = null;
        Evento e = null;

        try {

            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();

            if (evento instanceof EventoPrivado) {// compruebo si el evento es privaod o anuncio
                ResultSet r = st.executeQuery("select id,fecha_inicio,fecha_fin,nombre,descripcion,foto,id_usuario,lugar from evento where evento.id=" + evento.getId() + " and evento.isAnuncio=1");
                while (r.next()) {
                    EventoPrivado ep = new EventoPrivado(); // hago los set de la consulta
                    ep.setId(r.getInt("id"));
                    ep.setFechaIni(r.getDate("fecha_inicio"));
                    ep.setFechaFin(r.getDate("fecha_fin"));
                    ep.setNombre(r.getString("nombre"));
                    ep.setDescripcion(r.getString("descripcion"));
                    ep.setRutaFoto(r.getString("foto"));
                    ep.setUsuario(Usuario.selecionarUsuarioLite(r.getInt("id_usuario")));
                    ep.setLugar(r.getString("lugar"));
                    ep.setListcomentarios(Comentario.devolverListaComentarios(e));
                    ep.setAmigos(mostrarUsuariosEventoBD(ep));//lista de amigos invitados al evento
                    e = ep;
                }

            } else if (evento instanceof Anuncio) {// compruebo si el evento es un anuncio y hago los set de la consulta
                ResultSet r2 = st.executeQuery("select id,fecha_inicio,fecha_fin,nombre,descripcion,foto,id_usuario,precio from evento where evento.id=" + evento.getId() + " and evento.isAnuncio=0");
                while (r2.next()) {
                    usuario = Usuario.selecionarUsuarioLite(r2.getInt("id_usuario"));// cuidado al hacer el selecionarusuarioLite me he tirado 3horas mirando Xk
                    // y era por la conexion a la bbdd(yo estaba en la mia y PUsuario no)
                    Anuncio ep = new Anuncio();
                    ep.setId(r2.getInt("id"));
                    ep.setFechaIni(r2.getDate("fecha_inicio"));
                    ep.setFechaFin(r2.getDate("fecha_fin"));
                    ep.setNombre(r2.getString("nombre"));
                    ep.setDescripcion(r2.getString("descripcion"));
                    ep.setRutaFoto(r2.getString("foto"));
                    ep.setUsuario(usuario);                     //MIRAR LA CONEXION A  LA BBDD 
                    ep.setPrecio(r2.getFloat("precio"));
                    e = ep;
                }
            }

            st.close();
            con.close();
        } catch (Exception ex) {
            System.out.println(ex.toString());
        }

        return e;
    }

    public static Evento seleccionarEventoLiteBD(int codEvento) {
        int i = 0;
        Connection con = null;
        Statement st = null;
        Evento evento = null;
        try {

            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();

            ResultSet r = st.executeQuery("select id,fecha_inicio,nombre,foto,lugar from evento where evento.id=" + codEvento + " and evento.isAnuncio=1");
            while (r.next()) {//realizo la consulta si es un evento privado entra aqui y realiza los seter en eprivado
                EventoPrivado e = new EventoPrivado();
                e = new EventoPrivado();
                e.setId(r.getInt("id"));
                e.setFechaIni(r.getDate("fecha_inicio"));
                e.setNombre(r.getString("nombre"));
                e.setRutaFoto(r.getString("foto"));
                e.setLugar(r.getString("lugar"));
                evento = e;
            }

            ResultSet r2 = st.executeQuery("select id,fecha_inicio,nombre,foto,precio from evento where evento.id=" + codEvento + " and evento.isAnuncio=0");
            while (r2.next()) {//realizo la consulta si es un anuncio entra aqui y realiza los seter en anuncio
                Anuncio ep = new Anuncio();
                ep.setId(r2.getInt("id"));
                ep.setFechaIni(r2.getDate("fecha_inicio"));
                ep.setNombre(r2.getString("nombre"));
                ep.setRutaFoto(r2.getString("foto"));
                ep.setPrecio(r2.getFloat("precio"));
                evento = ep;
            }

            st.close();
            con.close();
        } catch (Exception ex) {
            System.out.println(ex.toString());
        }

        return evento;
    }

    public static List<Usuario> mostrarUsuariosEventoBD(Evento e) {// para ver los usuarios que van a un evento privado
        List<Usuario> amigosEvento = new ArrayList<Usuario>();
        Usuario usuario;
        try {
            Connection con = null;
            Statement st = null;
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();
            ResultSet r = st.executeQuery("select id,respuesta,id_usuario,id_evento from usuarioevento where usuarioevento.id_evento=" + e.getId());
            while (r.next()) {// realizo la consulta para ver los usuarios que van a un evento en concreto y lo meto en una lista, y devuelvo esa lista
                usuario = Usuario.selecionarUsuarioLite(r.getInt("id_usuario"));
                amigosEvento.add(usuario);
            }
            st.close();
            con.close();
        } catch (Exception ex) {
            System.out.println(ex.toString());
        }
        return amigosEvento;
    }

    public static List<Evento> mostrarEventosBD(Usuario usuario, int tipo) { // para mostrar los eventos de un usuario en concreto
        List<Evento> listaEventos = new ArrayList<Evento>();
        Evento evento = null;

        try {
            Connection con = null;
            Statement st = null;
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();
            ResultSet r = st.executeQuery("select id,fecha_inicio,nombre,foto,lugar,precio from evento where evento.id_usuario=" + usuario.getId() + " and isAnuncio=" + tipo);
            // realizo la consulta para devolver los eventos de un usuario en concreto y con el tipo miro si es un Ep o anuncio, para devolver solo los de un tipo
            while (r.next()) {
                int idEvento = r.getInt("id");
                Evento e = Evento.seleccionarEventoLite(idEvento);
                listaEventos.add(e);
            }
            st.close();
            con.close();
        } catch (Exception ex) {
            System.out.println(ex.toString());
        }
        return listaEventos; // devuelvo la lista de eventos de un usuario
    }

    public static void modificarEventoBD(Evento evento) {//recibe un evento modificado y lo insertamos en la bbdd
        int i = 0;
        Connection con = null;
        Statement st = null;
        Usuario usuario = null;
        java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String fechaIni = sdf.format(evento.getFechaIni());
        String fechaFin = sdf.format(evento.getFechaFin());

        try {

            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();

            if (evento instanceof EventoPrivado) {// si es Ep
                EventoPrivado e = (EventoPrivado) evento;
                st.executeUpdate("update evento set fecha_inicio='" + fechaIni + "',fecha_fin='" + fechaFin + "',nombre='" + e.getNombre() + "',descripcion='" + e.getDescripcion() + "',foto='" + e.getRutaFoto() + "',id_usuario=" + e.getUsuario().getId() + ",lugar='" + e.getLugar() + "' where evento.id=" + e.getId());

            } else if (evento instanceof Anuncio) {//si es anuncio
                Anuncio a = (Anuncio) evento;
                st.executeUpdate("update evento set fecha_inicio='" + fechaIni + "',fecha_fin='" + fechaFin + "',nombre='" + a.getNombre() + "',descripcion='" + a.getDescripcion() + "',foto='" + a.getRutaFoto() + "',id_usuario=" + a.getUsuario().getId() + "precio='" + a.getPrecio() + "' where evento.id=" + a.getId());
            }
            st.close();
            con.close();
        } catch (Exception ex) {
            System.out.println(ex.toString());
        }
    }

    public static void eliminarEventoBD(Evento e) {// recibe el evento que vamos a modificar
        Connection con = null;
        Statement st = null;

        try {

            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();

            st.executeUpdate("DELETE FROM evento WHERE ID = " + e.getId());

        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                st.close();
                con.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
    }
}
 